﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using Entidades;
using System.Collections;
using System.Collections.ObjectModel;
using System.Data.SqlClient;

namespace CapaDatos.Adapters
{
  public  class ActividadDidacticaAdapter
    {


       BDRinconLuzEntities contexto;

       public ActividadDidacticaAdapter()
        {
            contexto = RinconLuzContext.Context;
        }

       public ActividadDidacticaAdapter(string edicion)
        {
            contexto = RinconLuzContext.ContextNew;
        }


       public void Agregar(ActividadDidactica entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            if (entidad.ChangeTracker != null && entidad.ChangeTracker.State == ObjectState.Added)
            {
                contexto.RegistrarCambios(entidad);
                contexto.RealizarCambios();
            }
        }

       public void Eliminar(ActividadDidactica entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            IObjectSet<ActividadDidactica> objectSet = contexto.CrearSet<ActividadDidactica>();

            objectSet.Attach(entidad);
            objectSet.DeleteObject(entidad);
        }



       public void Modificar(ActividadDidactica entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            if (entidad.ChangeTracker != null && (entidad.ChangeTracker.State & ObjectState.Deleted) != ObjectState.Deleted)
            {
                entidad.MarkAsModified();
            }

            contexto.SaveChanges();
        }


       public IEnumerable<ActividadDidactica> Obtener()
        {
            return contexto.CrearSet<ActividadDidactica>();
        }

       public ActividadDidactica ObtenerEntidad(string nombre)
        {

            var ExisteEntidad = (from v in contexto.ActividadDidactica
                                 where v.NombreActividad.Contains(nombre) &&
                                          v.Eliminada != true
                           select v).Any();

             if (ExisteEntidad == true)
             {
                 var Entidad = (from v in contexto.ActividadDidactica
                                where v.NombreActividad.Contains(nombre) &&
                                          v.Eliminada != true
                                select v).First();
                 return Entidad;
             }
             else
             {
                 ActividadDidactica entidad = null;
                 return entidad;
             }
        }

        public bool VerificarNombreDuplicado(string nombre, Guid id)
        {
            if (id == Guid.Empty)
            {
                var ExisteEntidad = (from v in contexto.ActividadDidactica
                                     where v.NombreActividad.Trim().ToLower() == nombre.Trim().ToLower() &&
                                          v.Eliminada != true
                                     select v).Any();

                return ExisteEntidad;
            }
            else
            {
                var ExisteEntidad = (from v in contexto.ActividadDidactica
                                     where v.NombreActividad.Trim().ToLower() == nombre.Trim().ToLower() && v.IdActividad != id &&
                                          v.Eliminada != true
                                     select v).Any();

                return ExisteEntidad;

            }
        }


        public List<ViewEntity> ObtenerCoincidenciasPorNombre(string nombre)
        {
            List<ViewEntity> ListaFinal = new List<ViewEntity>();

            var ExisteEntidad = (from v in contexto.ActividadDidactica
                                 where v.NombreActividad.Contains(nombre) &&
                                                v.Eliminada != true
                           select v).Any();

             if (ExisteEntidad == true)
             {
                 var Entidades = (from v in contexto.ActividadDidactica
                                  where v.NombreActividad.Contains(nombre) &&
                                            v.Eliminada != true
                                select v).ToList();
                 
                if (Entidades.Count > 0)
                {

                    foreach (var item in Entidades)
                    {
                        ListaFinal.Add(new ViewEntity(item.IdActividad, item.NombreActividad));
                    }

                }             
                          
             }             

            return ListaFinal;
        }

        public ActividadDidactica ObtenerEntidad(Guid idActividad)
        {

            var Entidad = (from v in contexto.ActividadDidactica.Include("MaterialesActividad")
                           where v.IdActividad == idActividad &&
                                          v.Eliminada != true
                           select v).First();
            
            return Entidad;
        }


        public List<ViewEntity> ObtenerEntidades()
        {
            List<ViewEntity> ListaFinal = new List<ViewEntity>();


            var Entidades = (from v in contexto.ActividadDidactica
                           where v.Eliminada != true
                           select v).ToList();

            if (Entidades.Count > 0)
            {

                foreach (var item in Entidades)
                {
                    if(item.DuracionActividad == 1)
                        ListaFinal.Add(new ViewEntity(item.IdActividad, item.NombreActividad + " (" + item.DuracionActividad + " minuto)"));
                    else
                        ListaFinal.Add(new ViewEntity(item.IdActividad, item.NombreActividad + " (" + item.DuracionActividad + " minutos)"));
                }
            }

            return ListaFinal;
        }


        public bool ExistenEntidades()
        {

            var Existen = (from v in contexto.ActividadDidactica
                             where v.Eliminada != true
                             select v).Any();

            return Existen;
        }


        public ObservableCollection<string> ObtenerMaterialesDeActividad(Guid idActividad)
        {
            ObservableCollection<string> ListaFinal = new ObservableCollection<string>();

            var ExistenEntidades = (from v in contexto.MaterialActividad
                                 where v.IdActividad == idActividad
                                 select v).Any();

            if (ExistenEntidades == true)
            {
                var Entidades = (from v in contexto.MaterialActividad
                                 where v.IdActividad == idActividad
                                 select v.DescripcionMaterial).ToList();

                if (Entidades.Count > 0)
                {

                    foreach (var item in Entidades)
                    {
                        ListaFinal.Add(item);
                    }

                }


            }


            return ListaFinal;
        }

        public void EliminarMaterialesDeActividad(Guid idActividad)
        {
            
            var ExistenEntidades = (from v in contexto.MaterialActividad
                                 where v.IdActividad == idActividad
                                 select v).Any();

            if (ExistenEntidades == true)
            {
                int i = contexto.ExecuteStoreCommand("Exec SP_MaterialActividad_EliminarRegistros @IdActividad", new SqlParameter("IdActividad", idActividad));

            }


        }




        public TrackableCollection<MaterialActividad> ObtenerListaMateriales(Guid idActividad)
        {
            TrackableCollection<MaterialActividad> listaFinal= new TrackableCollection<MaterialActividad>();

            var ExistenEntidades = (from v in contexto.MaterialActividad
                                    where v.IdActividad == idActividad
                                    select v).Any();

            if (ExistenEntidades == true)
            {
                var Entidades = (from v in contexto.MaterialActividad
                                 where v.IdActividad == idActividad
                                 select v).ToList();

                foreach (var item in Entidades)
                {
                    listaFinal.Add(item);
                }

                return listaFinal;

            }
            else
            {
                return listaFinal;
            }


           
        }











    }
}
